home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Comm / AmiTCP30b2.lha / src / util / finger / net.c < prev    next >
C/C++ Source or Header  |  1994-02-24  |  5KB  |  187 lines

  1. RCS_ID_C = "$Id: net.c,v 6.2 1993/10/15 02:59:10 ppessi Exp $";
  2.  
  3. /*
  4.  * net.c - netfinger
  5.  *
  6.  * Copyright © 1993 AmiTCP/IP Group, <AmiTCP-group@hut.fi>
  7.  *                  Helsinki University of Technology, Finland.
  8.  *
  9.  * This program is derived from original work distributed in BSD Net 2.
  10.  *
  11.  * Created      : Fri Oct 15 01:29:07 1993 ppessi
  12.  * Last modified: Fri Oct 15 01:45:10 1993 ppessi
  13.  *
  14.  * $Log: net.c,v $
  15.  * Revision 6.2  1993/10/15  02:59:10  ppessi
  16.  * Polished AmiTCP support
  17.  *
  18.  */
  19.  
  20. /*
  21.  * Copyright (c) 1989 The Regents of the University of California.
  22.  * All rights reserved.
  23.  *
  24.  * This code is derived from software contributed to Berkeley by
  25.  * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
  26.  *
  27.  * Redistribution and use in source and binary forms, with or without
  28.  * modification, are permitted provided that the following conditions
  29.  * are met:
  30.  * 1. Redistributions of source code must retain the above copyright
  31.  *    notice, this list of conditions and the following disclaimer.
  32.  * 2. Redistributions in binary form must reproduce the above copyright
  33.  *    notice, this list of conditions and the following disclaimer in the
  34.  *    documentation and/or other materials provided with the distribution.
  35.  * 3. All advertising materials mentioning features or use of this software
  36.  *    must display the following acknowledgement:
  37.  *    This product includes software developed by the University of
  38.  *    California, Berkeley and its contributors.
  39.  * 4. Neither the name of the University nor the names of its contributors
  40.  *    may be used to endorse or promote products derived from this software
  41.  *    without specific prior written permission.
  42.  *
  43.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  44.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  45.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  46.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  47.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  48.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  49.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  50.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  51.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  52.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  53.  * SUCH DAMAGE.
  54.  */
  55.  
  56. static char sccsid[] = "@(#)net.c    5.5 (Berkeley) 6/1/90";
  57.  
  58. #include <sys/types.h>
  59. #include <sys/socket.h>
  60. #include <netinet/in.h>
  61. #include <netdb.h>
  62. #include <stdio.h>
  63. #include <string.h>
  64. #include <ctype.h>
  65.  
  66. void
  67. netfinger(char *name)
  68. {
  69.   extern int lflag;
  70. #if AMIGA
  71.   char buf[1];
  72. #else
  73.   register FILE *fp;
  74. #endif
  75.   register int c, lastc;
  76.   struct in_addr defaddr;
  77.   struct hostent *hp, def;
  78.   struct servent *sp;
  79.   struct sockaddr_in sin;
  80.   int s;
  81.   char *alist[1], *host;
  82.   u_long inet_addr();
  83.  
  84.   if (!(host = strchr(name, '@')))
  85.     return;
  86.   *host++ = NULL;
  87.   if (!(hp = gethostbyname(host))) {
  88.     defaddr.s_addr = inet_addr(host);
  89.     if (defaddr.s_addr == -1) {
  90.       (void)fprintf(stderr,
  91.             "finger: unknown host: %s\n", host);
  92.       return;
  93.     }
  94.     def.h_name = host;
  95.     def.h_addr_list = alist;
  96.     def.h_addr = (char *)&defaddr;
  97.     def.h_length = sizeof(struct in_addr);
  98.     def.h_addrtype = AF_INET;
  99.     def.h_aliases = 0;
  100.     hp = &def;
  101.   }
  102.   if (!(sp = getservbyname("finger", "tcp"))) {
  103.     (void)fprintf(stderr, "finger: tcp/finger: unknown service\n");
  104.     return;
  105.   }
  106.   sin.sin_family = hp->h_addrtype;
  107.   memcpy((char *)&sin.sin_addr, hp->h_addr, hp->h_length);
  108.   sin.sin_port = sp->s_port;
  109.   if ((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) {
  110.     perror("finger: socket");
  111.     return;
  112.   }
  113.  
  114.   /* have network connection; identify the host connected with */
  115.   (void)printf("[%s]\n", hp->h_name);
  116.   if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
  117.     perror("finger: connect");
  118.     (void)CloseSocket(s);
  119.     return;
  120.   }
  121.  
  122.   /* -l flag for remote fingerd  */
  123.   if (lflag)
  124.     (void)send(s, "/W ", 3, 0);
  125.   /* send the name followed by <CR><LF> */
  126.   (void)send(s, name, strlen(name), 0);
  127.   (void)send(s, "\r\n", 2, 0);
  128.  
  129.   /*
  130.    * Read from the remote system; once we're connected, we assume some
  131.    * data.  If none arrives, we hang until the user interrupts.
  132.    *
  133.    * If we see a <CR> or a <CR> with the high bit set, treat it as
  134.    * a newline; if followed by a newline character, only output one
  135.    * newline.
  136.    *
  137.    * Otherwise, all high bits are stripped; if it isn't printable and
  138.    * it isn't a space, we can simply set the 7th bit.  Every ASCII
  139.    * character with bit 7 set is printable.
  140.    */ 
  141. #if AMIGA
  142.   while (recv(s, buf, 1, 0) == 1) {
  143.     c = buf[0]; 
  144.     if (c == 0x0d) {
  145.       c = '\n';
  146.       lastc = '\r';
  147.     } else {
  148.       if (!isprint(c) && !isspace(c))
  149.     c |= 0x40;
  150.       if (lastc != '\r' || c != '\n')
  151.     lastc = c;
  152.       else {
  153.     lastc = '\n';
  154.     continue;
  155.       }
  156.     }
  157.     putchar(c);
  158.   }
  159.   if (lastc != '\n')
  160.     putchar('\n');
  161.   CloseSocket(s);
  162. #else
  163.   if (fp = fdopen(s, "r"))
  164.     while ((c = getc(fp)) != EOF) {
  165.       c &= 0x7f;
  166.       if (c == 0x0d) {
  167.     c = '\n';
  168.     lastc = '\r';
  169.       } else {
  170.     if (!isprint(c) && !isspace(c))
  171.       c |= 0x40;
  172.     if (lastc != '\r' || c != '\n')
  173.       lastc = c;
  174.     else {
  175.       lastc = '\n';
  176.       continue;
  177.     }
  178.       }
  179.       putchar(c);
  180.     }
  181.   if (lastc != '\n')
  182.     putchar('\n');
  183.   (void)fclose(fp);
  184. #endif
  185. }
  186.  
  187.